/* client.cpp */
#include "protocol.h"
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string>
#include <string.h>
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
  // 参数检查
  if(argc != 3)
  {
    cerr<<"Usage：clientName serverIp serverPort"<<endl;
    exit(1);
  }
  // 参数解析
  string serverIp = argv[1];
  int serverPort = atoi(argv[2]);
  // 创建套接字
  int linkSock = socket(AF_INET, SOCK_STREAM, 0);
  if(linkSock < 0)
  {
    cerr<<"socket error"<<endl;
    exit(2);
  }
  // 和服务端建立连接
  struct sockaddr_in peer;
  memset(&peer, 0, sizeof(peer));
  peer.sin_family = AF_INET;
  peer.sin_port = htons(serverPort);
  peer.sin_addr.s_addr = inet_addr(serverIp.c_str());// PS:注意用了inet_addr就不要在用htonl了，不然会转换出错

  if(connect(linkSock, (struct sockaddr*)&peer, sizeof(peer)) < 0)
  {
    cerr<<"connect error"<<endl;
    exit(3);
  }
  // 死循环从外界获得算式并交给服务端线程去完成任务
  while(1)
  {
    Request rq;
    cout<<"请输入左操作数（整数）：";
    cin>>rq.x;
    cout<<"请输入操作符（+-*/%）：";
    cin>>rq.op;
    cout<<"请输入右操作数（整数）：";
    cin>>rq.y;

    send(linkSock, &rq, sizeof(rq), 0);
    Respond rp;
    recv(linkSock, &rp, sizeof(rp), 0);
    cout<<"status:"<<rp.status<<' '<<"result="<<rp.result<<endl;
  }

  return 0;
}
